# from urllib import request
# Create your views here.
# 类视图 定义两个不同的方法处理 两种不同的请求方式
# 类视图 以请求方法为类方法 在对应的方式下编写对应的逻辑代码
# 自定义的类为普通类， 成为视图类 ，继承
from django.contrib.auth import authenticate, login,logout as out
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.shortcuts import render, redirect
from django.views import View

from user.forms import UserLRFrom


class UserView(View):
    # get 类方法处理地址都get请求
    def get(self, request):
        # 还没有页面给用户
        form = UserLRFrom()
        return render(request, 'user/register.html', {'form': form})

    def post(self, request):
        form = UserLRFrom(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            try:
                user = User(username=username)
                #     密码加密
                user.set_password(password)
                user.save()
            except IntegrityError:
                message = '用户名已存在'
            else:
                message = '注册成功！'
            return render(request, 'user/register.html', context={'message': message})


class LoginView(View):
    def get(self, request):
        # get 请求的时候获取页面数据， 需要把表单返回给到模版进行渲染
        form = UserLRFrom()
        # 渲染页面给用户
        # 把表单对象传输给到客户端 进行渲染
        return render(request, 'user/login.html', {'form': form})

    def post(self, request):
        # print(request.POST)
        # # 获取数据
        # username = request.POST.get('username')
        # password = request.POST.get('password')
        # 校验数据
        # 创建表单对象 保存绑定表单填写的数据， 让表单帮我们王超校验
        form = UserLRFrom(request.POST)
        if form.is_valid():
            # 获取通过校验后的数据 is_valid已经帮我们2完成了数据校验的操作
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            #如果正确的话 会返回一个用户对象 否则会返回一个空值
            user = authenticate(username = username,password = password)
            if user:
                #校验通过 把登录的用户信息放到请求对象中
                login(request,user)
                #生成新的或者更新用户会话 登录的用户信息放到请求对象中 绑定到request.user 后续请求get post通过request来获取登录的用户
                #使用内置的login来完成用户登录的认证 GET请求 get获取
                #处理会话的安全设置 超时时间
                next_url = request.GET.get('next')
                # 获取地址栏中的 next 参数保存的地址值
                if next_url:
                    #判断有没有next
                    return redirect(next_url)
                return  redirect('index')
            # 验证用户身份
            # try:
            #     user = User.objects.get(username=username)
            # # user = authenticate(request, username=username, password=password)
            # except User.DoesNotExist:
            #     message = '账户不存在，请注册后登录'
            # else:
            #     if user.check_password(password):
            #         # 账户密码正确 创建session 信息 ，做会话维持
            #         request.session['username'] = username
            #         # request.session.set_expiry()  # 过期时间的设置
            #         # login(request, user)  # 记录登录状态
            #         # message = '登录成功！'
            #         # 可以添加登录后的跳转逻辑，例如：
            #         return redirect('index')
            #     else:
            #         message = '登录失败！用户名或密码错误'
        return render(request, 'user/login.html', )


def logout(request, **kwargs):
# 退出账户
#     request.session.flush()
# 调用auth系统的out方法来退出登录 把请求对象用户登录信息清除
# 必须要先通过 authenticate 验证
    out(request)
    return redirect('login')
